package com.xialuo.study;

import com.xialuo.study.flow.PlanningFlow;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

import java.io.File;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Scanner;

@SpringBootApplication
public class DataAnalysisApplication {
    private static final Logger logger = LoggerFactory.getLogger(DataAnalysisApplication.class);

    public static void main(String[] args) {
        SpringApplication.run(DataAnalysisApplication.class, args);
    }

    @Bean
    public CommandLineRunner demo(PlanningFlow planningFlow) {
        return args -> {
            // 示例数据描述和分析目标
            String dataDescription = "销售数据，包含日期、产品名称、销售数量和销售金额等信息";
            String defaultAnalysisGoal = "分析销售趋势，识别最畅销产品";
            // 获取数据文件的路径
            String dataPath = getDataFilePath("sales_data.csv");

            // 创建Scanner对象读取用户输入
            Scanner scanner = new Scanner(System.in);

            System.out.println("\n欢迎使用数据分析工具!");
            System.out.println("默认分析目标: " + defaultAnalysisGoal);
            System.out.println("输入 'exit' 或 'quit' 退出程序\n");

            while (true) {
                try {
                    // 提示用户输入分析目标
                    System.out.println("请输入分析目标 (直接回车使用默认目标):");
                    System.out.print("> ");
                    String userInput = scanner.nextLine().trim();

                    // 检查是否退出
                    if (userInput.equalsIgnoreCase("exit") || userInput.equalsIgnoreCase("quit")) {
                        System.out.println("程序已退出");
                        break;
                    }

                    // 如果用户没有输入，则使用默认分析目标
                    String analysisGoal = userInput.isEmpty() ? defaultAnalysisGoal : userInput;

                    logger.info("开始执行分析流程...");
                    logger.info("数据描述: {}", dataDescription);
                    logger.info("分析目标: {}", analysisGoal);
                    logger.info("数据文件: {}", dataPath);

                    // 验证数据文件存在
                    validateDataFile(dataPath);

                    // 使用PlanningFlow执行完整的分析流程
                    String result = planningFlow.execute(dataDescription, analysisGoal, dataPath);

                    logger.info("分析完成");
                    System.out.println("\n================ 分析结果 ================\n");
                    System.out.println(result);
                    System.out.println("\n========================================\n");
                } catch (Exception e) {
                    logger.error("执行分析失败: {}", e.getMessage(), e);
                    System.err.println("执行失败：" + e.getMessage());
                }
            }
        };
    }
    /**
     * 获取数据文件的绝对路径
     */
    private String getDataFilePath(String fileName) {
        // 尝试从资源目录获取
        try {
            Path resourcePath = Paths.get(getClass().getClassLoader().getResource(fileName).toURI());
            if (Files.exists(resourcePath)) {
                return resourcePath.toAbsolutePath().toString();
            }
        } catch (Exception e) {
            // 忽略错误，尝试其他方式
        }
        // 尝试从当前目录和相对路径获取
        String[] possiblePaths = {
            fileName,
            "src/main/resources/" + fileName,
            "../src/main/resources/" + fileName
        };
        for (String path : possiblePaths) {
            if (Files.exists(Paths.get(path))) {
                return Paths.get(path).toAbsolutePath().toString();
            }
        }
        // 如果找不到，返回相对路径，后面会验证文件
        return "src/main/resources/" + fileName;
    }
    /**
     * 验证数据文件是否存在且可读
     */
    private void validateDataFile(String dataPath) {
        File file = new File(dataPath);
        if (!file.exists()) {
            throw new RuntimeException("数据文件不存在: " + dataPath);
        }
        if (!file.canRead()) {
            throw new RuntimeException("数据文件无法读取: " + dataPath);
        }
        logger.info("成功验证数据文件: {}", dataPath);
    }
}
